﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class FornecedorServicoProduto
    {
        #region Variaveis Membro
        private int _idFornecedorServicoProduto;
        private Organizacao _organizacaoFornecedor;
        private TipoServicoProduto _tipoServicoProduto;
        private GENTEEntities _context;
        #endregion

        #region Propriedadades
        public int IdFornecedorServicoProduto
        {
            get { return _idFornecedorServicoProduto; }
            set { _idFornecedorServicoProduto = value; }
        }
        public Organizacao OrganizacaoFornecedor
        {
            get { return _organizacaoFornecedor; }
            set { _organizacaoFornecedor = value; }
        }
        public TipoServicoProduto TipoServicoProduto
        {
            get { return _tipoServicoProduto; }
            set { _tipoServicoProduto = value; }
        }
        #endregion

        #region Construtores
        public FornecedorServicoProduto()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public FornecedorServicoProduto(int idFornecedorServicoProduto)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idFornecedorServicoProduto);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados

        #region Métodos Gerais
        private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
        {
            if (null == valueSelector)
            {
                throw new
                    ArgumentNullException("valueSelector");
            }
            if (null == values) { throw new ArgumentNullException("values"); }

            ParameterExpression p = valueSelector.Parameters.Single();
            if (!values.Any())
            {
                return e => false;
            }

            var equals = values.Select(value =>
            (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value,
            typeof(TValue))));
            var body = equals.Aggregate<Expression>((accumulate, equal) =>
            Expression.Or(accumulate, equal));
            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }
        #endregion

        #region Métodos de Seleção
        private void Carregar(int idFornecedorServicoProduto)
        {
            try
            {
                var consulta = from fsp in _context.tab_relacao_fornecedor_tipo_servico_produto
                               where fsp.id_fornecedor_servico == idFornecedorServicoProduto
                               select new { fsp.id_fornecedor_servico, id_organizacao_fornecedor = fsp.tab_organizacao.Id_organizacao, fsp.tab_tipo_servico_produto.Id_tipo_servico_produto };

                var listTipoServico = consulta.ToList();

                foreach (var list in listTipoServico)
                {
                    this._idFornecedorServicoProduto = list.id_fornecedor_servico;
                    this._organizacaoFornecedor = new Organizacao(list.id_organizacao_fornecedor);
                    this._tipoServicoProduto = new TipoServicoProduto(list.Id_tipo_servico_produto);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

        #region Metodos Publicos

        #region Metodos Selecao
        public List<FornecedorServicoProduto> SelectAll()
        {
            try
            {
                List<FornecedorServicoProduto> listFornecedorServicoProduto = new List<FornecedorServicoProduto>();

                var consulta = from fsp in _context.tab_relacao_fornecedor_tipo_servico_produto
                               select new { fsp.id_fornecedor_servico, id_organizacao_fornecedor = fsp.tab_organizacao.Id_organizacao, fsp.tab_tipo_servico_produto.Id_tipo_servico_produto };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    FornecedorServicoProduto fornecedorServicoProduto = new FornecedorServicoProduto();
                    fornecedorServicoProduto.IdFornecedorServicoProduto = list.id_fornecedor_servico;
                    fornecedorServicoProduto.OrganizacaoFornecedor = new Organizacao(list.id_organizacao_fornecedor);
                    fornecedorServicoProduto.TipoServicoProduto = new TipoServicoProduto(list.Id_tipo_servico_produto);

                    listFornecedorServicoProduto.Add(fornecedorServicoProduto);
                }
                return listFornecedorServicoProduto;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<FornecedorServicoProduto> SelectServicosProdutos(string servicoProduto, int idPrestador, int idLocalidade, int idCategoriaServicoProduto)
        {
            try
            {
                List<FornecedorServicoProduto> listFornecedorServicoProduto = new List<FornecedorServicoProduto>();

                var consulta = (from fornec_servprod in _context.tab_relacao_fornecedor_tipo_servico_produto
                                join prest_serv in _context.tab_relacao_prestador_tipo_servico_produto on fornec_servprod.id_fornecedor_servico equals prest_serv.tab_relacao_fornecedor_tipo_servico_produto.id_fornecedor_servico
                                where (prest_serv.tab_organizacao.Id_organizacao == idPrestador)
                                && (prest_serv.tab_status.id_status == 1)
                                && (prest_serv.tab_cidade.id_cidade == idLocalidade)
                                && (fornec_servprod.tab_tipo_servico_produto.tab_categoria_servico_produto.Id_categoria_servico_produto == idCategoriaServicoProduto)
                                && ((servicoProduto != string.Empty) ? (fornec_servprod.tab_tipo_servico_produto.descricao.Contains(servicoProduto)) : (1 == 1))
                                select new
                                {
                                    fornec_servprod.id_fornecedor_servico,
                                    fornec_servprod.tab_tipo_servico_produto.Id_tipo_servico_produto
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    FornecedorServicoProduto fornecedorServicoProduto = new FornecedorServicoProduto();
                    fornecedorServicoProduto.IdFornecedorServicoProduto = list.id_fornecedor_servico;
                    fornecedorServicoProduto.TipoServicoProduto = new TipoServicoProduto(list.Id_tipo_servico_produto);

                    listFornecedorServicoProduto.Add(fornecedorServicoProduto);
                }

                return listFornecedorServicoProduto;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persitencia
        //public void Salvar()
        //{
        //    try
        //    {
        //        if (!ExisteCadastro())
        //        {
        //            tab_organizacao_relacao_patrocinador tabRel = new tab_organizacao_relacao_patrocinador();
        //            tabRel.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "id_organ_patrocinador", _organizacaoPatrocinador.IdOrganizacao);
        //            tabRel.tab_organizacao1Reference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao1", "id_organ_prestador", _organizacaoPrestador.IdOrganizacao);
        //            tabRel.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status_patrocinador", _status.IdStatus);

        //            _context.AddTotab_organizacao_relacao_patrocinador(tabRel);
        //            _context.SaveChanges();
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }
        //}
        #endregion

        #endregion

    }
}
